package com.yun.bootsocket;

import com.yun.SpringUtil;
import com.yun.pojo.Msg;
import com.yun.service.MsgService;
import io.netty.channel.Channel;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.channel.group.ChannelGroup;
import io.netty.channel.group.DefaultChannelGroup;
import io.netty.handler.codec.http.websocketx.TextWebSocketFrame;
import io.netty.util.concurrent.GlobalEventExecutor;

import java.net.InetAddress;
import java.time.LocalDateTime;


/**
 *@Description: 处理消息的handler
 *TextWebSocketFrame: 在netty中，是用于为websocket专门处理文本的对象，frame是消息的载体
 */
public class ChatHandler extends SimpleChannelInboundHandler<TextWebSocketFrame> {

    //用于记录和管理所有客户端的channel
    private static ChannelGroup clients = new DefaultChannelGroup(GlobalEventExecutor.INSTANCE);

    @Override
    protected void channelRead0(ChannelHandlerContext ctx, TextWebSocketFrame msg) throws Exception {
        //获取客户端传输过来的消息
        String content = msg.text();
        System.out.println("接受到的数据:" + content);

        for (Channel channel: clients){
            channel.writeAndFlush(new TextWebSocketFrame("[服务器在：]" + LocalDateTime.now() + "接收到消息, 消息为: "+ content));
        }

        // 下面这个方法，和上面的for循环，一致
        // clients.writeAndFlush("[服务器在：]" + LocalDateTime.now() + "接收到消息, 消息为: "+ content);
        if (content != null){
            Msg msg1 = new Msg();
            MsgService msgService = (MsgService) SpringUtil.getBean("msgServiceImpl");
            msg1.setMsg(content);
            String save = msgService.SaveMsg(msg1);
            System.out.println("数据插入数据库成功==============="+save);

        }
        InetAddress inetAddress = InetAddress.getLocalHost();
        System.out.println("本机ip地址========"+inetAddress);
    }

    /**
     * 当客户端连接服务端之后(打开连接)
     * 获取客户端的channel，并且放到ChannelGroup中去进行管理
     */
    @Override
    public void handlerAdded(ChannelHandlerContext ctx) throws Exception {
        clients.add(ctx.channel());
    }

    @Override
    public void handlerRemoved(ChannelHandlerContext ctx) throws Exception {
       // 当触发handlerRemoved,ChannelGroup会自动移除对应客户端的channel
       // clients.remove(ctx.channel());
        System.out.println("客户端断开，channel对应的长id为:" + ctx.channel().id().asLongText());
        System.out.println("客户端断开，channel对应的短id为:" + ctx.channel().id().asShortText());
    }
}
